\begin{Exercise}[title={进程},difficulty=2]
\label{ex:processes}
\Question\label{ex:processes q1}
编写一个程序，列出所有正在运行的进程，并打印每个进程执行的子进程个数。
输出应当类似：
%% For some reason the spacing in Exercise env. does weird things
\vskip\baselineskip
\begin{display}
Pid 0 has 2 children: [1 2]
Pid 490 has 2 children: [1199 26524]
Pid 1824 has 1 child: [7293]
\end{display}
\vskip\baselineskip
\begin{itemize}
\item{为了获取进程列表，需要得到 \verb|ps -e -opid,ppid,comm| 的输出。输出类似：
\vskip\baselineskip
\begin{display}
  PID  PPID COMMAND
 9024  9023 zsh
19560  9024 ps
\end{display}
\vskip\baselineskip}
\item{如果父进程有一个子进程，就打印 \verb|child|，如果多于一个，就打印 \verb|children|；}
\item{进程列表要按照数字排序，这样就以 pid 0 开始，依次展示。}
\end{itemize}
这里有一个 Perl 版本的程序来帮助上手（或者造成绝对的混乱）。
\lstinputlisting[caption={Perl 显示进程}]{ex-communication/src/proc.pl}
\end{Exercise}

\begin{Answer}
\Question 有许多工作需要做。可以将程序分为以下几个部分：
\begin{enumerate}
\item{运行 \verb|ps| 获得输出；}
\item{解析输出并保存每个 PPID 的子 PID；}
\item{排序 PPID 列表；}  
\item{打印排序后的列表到屏幕。}
\end{enumerate}
在下面的解法中，使用了一个 \type{map[int][]int}，就是一个使用整数作为 map 的索引，元素是整数的 slice —— 用于保存 PID。内建的 \func{append} 被用于扩展这个整数的 slice。

程序清单：
\lstinputlisting[caption=Go 显示进程]{ex-communication/src/proc.go}
\end{Answer}
